﻿using System;
using System.IO;

namespace FolderSynchronizer
{
	/// <summary>
	/// Исключение возникающее при работе класса Synchronizer.
	/// </summary>
	public class SynchronizerException : Exception
	{
		/// <summary>
		/// Конструктор ошибки, связанный с файлом.
		/// </summary>
		/// <param name="fileInfo">Информация о файле, при работе с которым произошла ошибка.</param>
		/// <param name="error">Тип ошибки, которая произошла при обработке файла.</param>
		public SynchronizerException(FileInfo fileInfo, ErrorType error)
		{
			FileInfo = fileInfo;
			Error = error;
		}

        /// <summary>
        /// Конструктор ошибки, связанной с устройствами.
        /// </summary>
        /// <param name="driveInfo">Информация об устройстве на котором недостаточно места.</param>
        /// <param name="error">Тип ошибки, которая произошла при синхронихации.</param>
		/// <param name="size">Количество байт, необходимое для размещения файлов.</param>
        public SynchronizerException(DriveInfo driveInfo, ErrorType error, long size)
        {
            DriveInfo = driveInfo;
            Error = error;
			NotFreeSpace = size;
        }

        /// <summary>
        /// Конструтор простой ошибки.
        /// </summary>
        /// <param name="error"></param>
        public SynchronizerException(ErrorType error)
        {
            Error = error;
        }

        /// <summary>
		/// Тип ошибки синхронизации.
		/// </summary>
		public enum ErrorType
		{
			/// <summary>
			/// Не удалось получить доступ на запись файла
			/// </summary>
			CantGetWriteAccess,

			/// <summary>
			/// Ошибка котрольных сумм.
			/// </summary>
			ChackSumError,

            /// <summary>
            /// Недостаточно места на носителе.
            /// </summary>
            DriversOutOfMemory,

            /// <summary>
            /// Не найден делегат.
            /// </summary>
            DelegateNotFounded,

            /// <summary>
            /// Атрибут не найден.
            /// </summary>
            AttributeNotFound,
            
            /// <summary>
            /// Файл с контрольными сумми некорректен. 
            /// </summary>
            ChackSummFileInvalid
		}

		/// <summary>
		/// Информация о файле, во время копирования которого произошла ошибка
		/// </summary>
		public FileInfo FileInfo { get; private set; }


        /// <summary>
        /// Информация о диске, который имеет неподходящий для копирования объем свободного места.
        /// </summary>
        public DriveInfo DriveInfo { get; private set; }

		/// <summary>
		/// Количество байт, необходимое для размещения файлов на диске.
		/// </summary>
		public long NotFreeSpace { get; private set; }

		/// <summary>
		/// Тип ошибки
		/// </summary>
		public ErrorType Error { get; private set; }
	}
}
